#include "SortExterno.h"
#include "QuickSort.h"
#include <sstream>

SortExterno::SortExterno() {
	this->particiones = 0;
	this->path_particiones = "./Indice/particion";
}

SortExterno::~SortExterno() {
}

void SortExterno::sort(Termino_Parseado* terminos, int cantidad_terminos) {
	QuickSort qs;

	// Creo un arreglo de punteros a los terminos
	// para poder realizar el quicksort
	this->array_punteros  = new Termino_Parseado* [cantidad_terminos];
	this->cargar_array(terminos, cantidad_terminos);
	qs.sort(this->array_punteros, 0, cantidad_terminos-1);

	// Creo un arreglo auxiliar a partir de los resultados devueltos
	// por el quick sort
	Termino_Parseado* aux = new Termino_Parseado[cantidad_terminos];
	int i = 0;
	while ( i < cantidad_terminos) {
		memcpy(&aux[i], (array_punteros[i]), sizeof(Termino_Parseado));
		i++;
	}

	// Generoo la informacion de la particion y la guardo en la lista de particiones
	std::string path(this->path_particiones);
	std::stringstream s;
	s << this->particiones;
	path.append(s.str());
	FILE* salida = fopen(path.c_str(),"w+");
	this->particiones++;
	this->particiones_generadas.push_back(path);

	//Grabo los terminos parseados ordenados
	fwrite(aux, cantidad_terminos ,sizeof(Termino_Parseado),salida);
	fclose(salida);
	delete[] aux;
	delete[] terminos;
	delete[] this->array_punteros;
}


void SortExterno::cargar_array(Termino_Parseado* terminos, int cantidad_terminos) {
	int i = 0;
	while (i < cantidad_terminos) {
		this->array_punteros[i]  = &terminos[i];
		i++;
	}
}

std::list<std::string> SortExterno::getParticionesGeneradas(){
	return this->particiones_generadas;
}
